#include<iostream>

using namespace std;
int t, w;
const int N = 1e3 + 10;
int a[N];
int f[N][N];
int main()
{
    cin >> t >> w;
    for (int i = 1; i <= t; i++)
    {
        cin >> a[i];
    }
// zdl:: 这道题目可以直接使用线性dp来解决，这道题目其实回事纷纷简单就是需要我们仔细来推到相关的状态装壹方城！！！
    // f[i][j] :: 在i分钟时，在移动次数为j时，此时所能吃到的最大的苹果数量！！！
    for (int i = 1; i <= t; i++)
    {
        for (int j = 0; j <= w; j++)
        {
            int c = 0;
            if (j % 2 == 0 && a[i] == 1 || (j % 2 == 1 && a[i] == 2)) c = 1;
            // zdl: 在这里，我也有考虑到需要建筑工这个不分的夫妇和索引值的值特殊处理，但现在还是先学习吧，
            f[i][j] = f[i - 1][j] + c;
            if (j) f[i][j] = max(f[i][j], f[i - 1][j - 1] + c);
        }
    }

    int ret = 0;
    for (int i = 0; i <= w; i++)
    {
        ret = max(ret, f[t][i]);
    }
    cout << ret << endl;
    return 0;
}

// zdl::  现在时间先都发生了改变，谁有有这个责任来爱该这一切